package org.jet.emall.common.restful.result;

import lombok.Data;

/**
 * @author xiaozai
 * @version 1.0
 * @date 2020-04-05 08:53
 */
@Data
public class CommonResult<T> {
    /**
     * 返回给客户端的状态码，严格遵守restful规范
     */
    private long code;
    /**
     * 返回给客户端的提示消息
     */
    private String message;
    /**
     * 返回给客户端的数据载荷
     */
    private T data;

    protected CommonResult() {
    }

    /**
    *  当GET, PUT和PATCH请求成功时，要返回对应的数据，及状态码200，即SUCCESS
     *  * 当POST创建数据成功时，要返回创建的数据，及状态码201，即CREATED
     *  * 当DELETE删除数据成功时，不返回数据，状态码要返回204，即NO CONTENT
     *  * 当GET 不到数据时，状态码要返回404，即NOT FOUND
     *  * 任何时候，如果请求有问题，如校验请求数据时发现错误，要返回状态码 400，即BAD REQUEST
     *  * 当API 请求需要用户认证时，如果request中的认证信息不正确，要返回状态码 401，即UNAUTHORIZED
     *  * 当API 请求需要验证用户权限时，如果当前用户无相应权限，要返回状态码 403，即FORBIDDEN
    * */

    protected CommonResult(long code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }

    /**
     * GET/PUT/PATCH 请求成功返回结果,状态码 200
     *
     *
     */
    public static <T> CommonResult<T> success() {
        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), null);
    }

    /**
     * GET/PUT/PATCH 请求成功返回结果,状态码 200
     * @param message 提示消息
     *
     */
    public static <T> CommonResult<T> success(String message) {
        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, null);
    }

    /**
     * GET/PUT/PATCH 请求成功返回结果,状态码 200
     *
     * @param data 获取的数据
     */
    public static <T> CommonResult<T> success(T data) {
        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage(), data);
    }

    /**
     * GET/PUT/PATCH 成功返回结果,状态码 200
     *
     * @param data 获取的数据
     * @param  message 提示信息
     */
    public static <T> CommonResult<T> success(T data, String message) {
        return new CommonResult<T>(ResultCode.SUCCESS.getCode(), message, data);
    }


    /**
     *  POST 请求创建成功返回结果,状态码 201
     *
     *  @param data 获取的数据
     *  @param  message 提示信息
     * */
    public static <T> CommonResult<T> created(T data, String message){
        return new CommonResult<T>(ResultCode.CREATED.getCode(),message,data);
    }

    /**
     *  POST 请求创建成功返回结果,状态码 201
     *  @param  message 提示信息
     * */
    public static <T> CommonResult<T> created( String message){
        return new CommonResult<T>(ResultCode.CREATED.getCode(),message,null);
    }

    /**
     *  POST 请求创建成功返回结果,状态码 201
     * */
    public static <T> CommonResult<T> created(){
        return new CommonResult<T>(ResultCode.CREATED.getCode(),ResultCode.CREATED.getMessage(),null);
    }

    /**
     *  DELETE请求成功返回结果,状态码 204
     * @param data  返回给客户端的数据
     * @param message 提示消息
     * */
    public static <T> CommonResult<T> deleted(T data,String message){
        return new CommonResult<T>(ResultCode.NO_CONTENT.getCode(),message,data);
    }

    /**
     * DELETE请求成功返回结果,状态码 204
     * @param message 提示消息
     */
    public static <T> CommonResult<T> deleted(String message){
        return new CommonResult<T>(ResultCode.NO_CONTENT.getCode(),message,null);
    }

    /**
     * DELETE请求成功返回结果,状态码 200
     * @return
     */
    public static <T> CommonResult<T> deleted(){
        return new CommonResult<T>(ResultCode.NO_CONTENT.getCode(),ResultCode.NO_CONTENT.getMessage(),null);
    }

    /**
     * GET请求找不到资源时返回结果,状态码404
     * 资源未找到
     */
    public static <T> CommonResult<T> notFound(){
        return new CommonResult<T>(ResultCode.NOT_FOUND.getCode(),ResultCode.NOT_FOUND.getMessage(),null);
    }

    /**
     *
     * GET请求找不到资源时返回结果,状态码404
     * 资源未找到
     * @param message 提示消息
     */
    public static <T> CommonResult<T> notFound(String message){
        return new CommonResult<T>(ResultCode.NOT_FOUND.getCode(),message,null);
    }

    /**
     *  请求有问题，校验出错时返回结果,状态码 400
     */
    public static <T> CommonResult<T> badRequest(){
        return new CommonResult<T>(ResultCode.BAD_REQUEST.getCode(),ResultCode.BAD_REQUEST.getMessage(),null);
    }

    /**
     *  请求有问题，校验出错时返回结果,状态码 400
     * @param message 提示消息
     */
    public static <T> CommonResult<T> badRequest(String message){
        return new CommonResult<T>(ResultCode.BAD_REQUEST.getCode(),message,null);
    }

    /**
     *
     * 服务器内部错误
     * @return
     */
    public static <T> CommonResult<T> serverError(){
        return new CommonResult<T>(ResultCode.SERVER_ERROR.getCode(),ResultCode.SERVER_ERROR.getMessage(),null);
    }

    /**
     *
     * 服务器内部错误
     * @param message 提示消息
     * @return
     */
    public static <T> CommonResult<T> serverError(String message){
        return new CommonResult<T>(ResultCode.SERVER_ERROR.getCode(),message,null);
    }

    /**
     * 未登录返回结果,状态码 401
     * @param data 获取的数据
     */
    public static <T> CommonResult<T> unauthorized(T data) {
        return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), data);
    }

    /**
     * 未登录返回结果,状态码 401
     */
    public static <T> CommonResult<T> unauthorized() {
        return new CommonResult<T>(ResultCode.UNAUTHORIZED.getCode(), ResultCode.UNAUTHORIZED.getMessage(), null);
    }


    /**
     * 未授权返回结果,状态码 403
     * @param data 获取的数据
     */
    public static <T> CommonResult<T> forbidden(T data) {
        return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), data);
    }

    /**
     * 未授权返回结果,状态码 403
     */
    public static <T> CommonResult<T> forbidden() {
        return new CommonResult<T>(ResultCode.FORBIDDEN.getCode(), ResultCode.FORBIDDEN.getMessage(), null);
    }


    @Override
    public String toString() {
        return "CommonResult[code="+code+",message="+message+","+(data==null?"data==null":"")+"]";
    }
}
